Una gu铆a completa de Cypress, el potente framework de pruebas de extremo a extremo, que cubre la instalaci贸n, escritura de pruebas, depuraci贸n, integraci贸n CI/CD y mejores pr谩cticas.
Cypress: La Gu铆a Definitiva de Pruebas de Extremo a Extremo para Aplicaciones Web
En el panorama del desarrollo web que evoluciona r谩pidamente hoy en d铆a, asegurar la calidad y fiabilidad de las aplicaciones web es primordial. Las pruebas de Extremo a Extremo (E2E) juegan un papel crucial en la verificaci贸n de que todos los componentes de una aplicaci贸n funcionan juntos sin problemas desde la perspectiva del usuario. Cypress ha surgido como un framework de pruebas E2E l铆der, que ofrece una experiencia amigable para el desarrollador, caracter铆sticas potentes y un rendimiento excelente. Esta gu铆a completa lo guiar谩 a trav茅s de todo lo que necesita saber para comenzar con Cypress y probar eficazmente sus aplicaciones web.
驴Qu茅 es Cypress?
Cypress es una herramienta de pruebas front-end de pr贸xima generaci贸n construida para la web moderna. A diferencia de los frameworks de pruebas tradicionales que ejecutan pruebas en un navegador, Cypress opera directamente en el navegador, brind谩ndole un control y visibilidad sin precedentes sobre el comportamiento de su aplicaci贸n. Est谩 dise帽ado para ser r谩pido, fiable y f谩cil de usar, lo que lo convierte en una opci贸n popular entre los desarrolladores e ingenieros de control de calidad de todo el mundo. Cypress est谩 escrito en JavaScript y se ejecuta dentro del navegador, lo que lo hace muy eficiente y ofrece un acceso sin precedentes a los elementos internos de la aplicaci贸n.
Beneficios clave de usar Cypress
- Amigable para el desarrollador: Cypress proporciona una API limpia e intuitiva, lo que facilita la escritura y depuraci贸n de pruebas.
- Viaje en el tiempo: Cypress toma instant谩neas del estado de su aplicaci贸n durante cada comando de prueba, lo que le permite retroceder en el tiempo y ver exactamente lo que sucedi贸 en cualquier momento.
- Recargas en tiempo real: Cypress se recarga autom谩ticamente cuando realiza cambios en sus pruebas, proporcionando retroalimentaci贸n instant谩nea.
- Espera autom谩tica: Cypress espera autom谩ticamente a que los elementos se vuelvan visibles o interactuables antes de realizar acciones, eliminando la necesidad de esperas expl铆citas.
- Control de red: Cypress le permite simular peticiones y respuestas de red, lo que le permite simular diferentes escenarios y probar el manejo de errores de su aplicaci贸n.
- Depuraci贸n: Cypress proporciona excelentes herramientas de depuraci贸n, incluido un potente depurador y mensajes de error detallados.
- Pruebas entre navegadores: Cypress es compatible con varios navegadores, incluidos Chrome, Firefox, Edge y Electron.
- Pruebas sin interfaz: Ejecute pruebas en modo sin interfaz para una ejecuci贸n m谩s r谩pida en entornos CI/CD.
- Afirmaciones integradas: Cypress proporciona un rico conjunto de afirmaciones integradas para verificar el comportamiento esperado de su aplicaci贸n.
Instalaci贸n y configuraci贸n
Comenzar con Cypress es sencillo. Aqu铆 le mostramos c贸mo instalarlo:
- Requisitos previos: Aseg煤rese de tener Node.js y npm (Administrador de paquetes de nodos) instalados en su sistema. Puede descargarlos del sitio web oficial de Node.js.
- Instalar Cypress: Abra su terminal o s铆mbolo del sistema, navegue hasta el directorio de su proyecto y ejecute el siguiente comando:
- Abrir Cypress: Una vez que se complete la instalaci贸n, puede abrir el Ejecutor de pruebas de Cypress ejecutando:
npm install cypress --save-dev
npx cypress open
Este comando iniciar谩 el Ejecutor de pruebas de Cypress, que proporciona una interfaz gr谩fica para ejecutar y depurar sus pruebas.
Escribiendo su primera prueba Cypress
Creemos una prueba simple para verificar que la p谩gina de inicio de un sitio web se cargue correctamente. Cree un nuevo archivo llamado `example.cy.js` en el directorio `cypress/e2e` de su proyecto.
// cypress/e2e/example.cy.js
describe('Mi primera prueba', () => {
it('Visita el Kitchen Sink', () => {
cy.visit('https://example.cypress.io')
cy.contains('type').click()
cy.url().should('include', '/commands/actions')
cy.get('.action-email')
.type('fake@email.com')
.should('have.value', 'fake@email.com')
})
})
Desglosemos esta prueba:
- `describe()`: Define un conjunto de pruebas, que es una colecci贸n de pruebas relacionadas.
- `it()`: Define un caso de prueba individual dentro del conjunto de pruebas.
- `cy.visit()`: Navega a la URL especificada.
- `cy.contains()`: Encuentra un elemento que contiene el texto especificado.
- `.click()`: Hace clic en el elemento seleccionado.
- `cy.url()`: Obtiene la URL actual de la p谩gina.
- `.should()`: Hace una afirmaci贸n sobre el estado de la aplicaci贸n.
- `cy.get()`: Selecciona un elemento usando un selector CSS.
- `.type()`: Escribe texto en el elemento seleccionado.
- `.should('have.value', 'fake@email.com')`: Afirma que el valor del elemento es igual a 'fake@email.com'.
Ejecute esta prueba en el Ejecutor de pruebas de Cypress para verla en acci贸n. Deber铆a ver el navegador navegar al sitio web Cypress Kitchen Sink, hacer clic en el enlace "type" y verificar la URL.
Comandos de Cypress
Cypress proporciona una amplia gama de comandos para interactuar con su aplicaci贸n. Aqu铆 hay algunos de los comandos m谩s utilizados:
- `cy.visit(url)`: Navega a la URL especificada.
- `cy.get(selector)`: Selecciona un elemento usando un selector CSS.
- `cy.contains(content)`: Selecciona un elemento que contiene el texto especificado.
- `cy.click()`: Hace clic en el elemento seleccionado.
- `cy.type(text)`: Escribe texto en el elemento seleccionado.
- `cy.clear()`: Borra el contenido de un elemento de entrada o de 谩rea de texto.
- `cy.submit()`: Env铆a un formulario.
- `cy.check()`: Marca una casilla de verificaci贸n o un bot贸n de radio.
- `cy.uncheck()`: Desmarca una casilla de verificaci贸n.
- `cy.select(value)`: Selecciona una opci贸n de un men煤 desplegable.
- `cy.scrollTo(position)`: Desplaza la p谩gina a la posici贸n especificada.
- `cy.trigger(event)`: Activa un evento DOM en el elemento seleccionado.
- `cy.request(url, options)`: Realiza una solicitud HTTP a la URL especificada.
- `cy.intercept(route, handler)`: Intercepta solicitudes HTTP que coinciden con la ruta especificada.
- `cy.wait(time)`: Espera la cantidad de tiempo especificada.
- `cy.reload()`: Vuelve a cargar la p谩gina actual.
- `cy.go(direction)`: Navega a la p谩gina anterior o siguiente en el historial del navegador.
- `cy.url()`: Obtiene la URL actual de la p谩gina.
- `cy.title()`: Obtiene el t铆tulo de la p谩gina.
- `cy.window()`: Obtiene el objeto window.
- `cy.document()`: Obtiene el objeto document.
- `cy.viewport(width, height)`: Establece el tama帽o de la ventana gr谩fica.
Estos son solo algunos de los muchos comandos disponibles en Cypress. Consulte la documentaci贸n de Cypress para obtener una lista completa de comandos y sus opciones.
Afirmaciones en Cypress
Las afirmaciones se utilizan para verificar el comportamiento esperado de su aplicaci贸n. Cypress proporciona un rico conjunto de afirmaciones integradas que puede usar para verificar el estado de los elementos, la URL, el t铆tulo y m谩s. Las afirmaciones se encadenan despu茅s de los comandos de Cypress usando el m茅todo `.should()`.
Aqu铆 hay algunos ejemplos comunes de afirmaciones:
- `.should('be.visible')`: Afirma que un elemento es visible.
- `.should('not.be.visible')`: Afirma que un elemento no es visible.
- `.should('be.enabled')`: Afirma que un elemento est谩 habilitado.
- `.should('be.disabled')`: Afirma que un elemento est谩 deshabilitado.
- `.should('have.text', 'texto esperado')`: Afirma que un elemento tiene el texto especificado.
- `.should('contain', 'texto esperado')`: Afirma que un elemento contiene el texto especificado.
- `.should('have.value', 'valor esperado')`: Afirma que un elemento tiene el valor especificado.
- `.should('have.class', 'clase esperada')`: Afirma que un elemento tiene la clase especificada.
- `.should('have.attr', 'nombre del atributo', 'valor esperado')`: Afirma que un elemento tiene el atributo y el valor especificados.
- `.should('have.css', 'propiedad css', 'valor esperado')`: Afirma que un elemento tiene la propiedad CSS y el valor especificados.
- `.should('have.length', longitud esperada)`: Afirma que un elemento tiene la longitud especificada (por ejemplo, el n煤mero de elementos en una lista).
Tambi茅n puede crear afirmaciones personalizadas para satisfacer sus necesidades espec铆ficas.
Mejores pr谩cticas para escribir pruebas Cypress
Seguir las mejores pr谩cticas puede ayudarle a escribir pruebas Cypress m谩s f谩ciles de mantener, fiables y eficientes. Aqu铆 hay algunas recomendaciones:
- Escriba pruebas claras y concisas: Cada prueba debe centrarse en una funcionalidad o escenario espec铆fico. Evite escribir pruebas demasiado complejas que sean dif铆ciles de entender y mantener.
- Utilice nombres de pruebas significativos: D茅 a sus pruebas nombres descriptivos que indiquen claramente qu茅 est谩n probando.
- Evite codificar valores de forma r铆gida: Utilice variables o archivos de configuraci贸n para almacenar valores que puedan cambiar con el tiempo.
- Utilice comandos personalizados: Cree comandos personalizados para encapsular la l贸gica reutilizable y hacer que sus pruebas sean m谩s legibles.
- A铆sle las pruebas: Cada prueba debe ser independiente de otras pruebas. Evite depender del estado de la aplicaci贸n de pruebas anteriores.
- Limpie despu茅s de las pruebas: Restablezca el estado de la aplicaci贸n despu茅s de cada prueba para asegurarse de que las pruebas posteriores comiencen desde una base limpia.
- Utilice atributos de datos: Utilice atributos de datos (por ejemplo, `data-testid`) para seleccionar elementos en sus pruebas. Es menos probable que los atributos de datos cambien que las clases o ID de CSS, lo que hace que sus pruebas sean m谩s resistentes a los cambios en la interfaz de usuario.
- Evite las esperas expl铆citas: Cypress espera autom谩ticamente a que los elementos se vuelvan visibles o interactuables. Evite usar esperas expl铆citas (por ejemplo, `cy.wait()`) a menos que sea absolutamente necesario.
- Pruebe los flujos de usuarios: Conc茅ntrese en probar los flujos de usuarios en lugar de componentes individuales. Esto le ayudar谩 a asegurarse de que su aplicaci贸n funcione correctamente desde la perspectiva del usuario.
- Ejecute pruebas con regularidad: Integre las pruebas de Cypress en su canalizaci贸n de CI/CD y ejec煤telas con regularidad para detectar errores al principio del proceso de desarrollo.
T茅cnicas avanzadas de Cypress
Stubbing y Mocking
Cypress le permite simular peticiones y respuestas de red, lo que le permite simular diferentes escenarios y probar el manejo de errores de su aplicaci贸n. Esto es particularmente 煤til para probar funciones que se basan en API o servicios externos.
Para simular una petici贸n de red, puede utilizar el comando `cy.intercept()`. Por ejemplo, el c贸digo siguiente simula una petici贸n GET a `/api/users` y devuelve una respuesta simulada:
cy.intercept('GET', '/api/users', {
statusCode: 200,
body: [
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Doe' }
]
}).as('getUsers')
A continuaci贸n, puede esperar la petici贸n interceptada usando `cy.wait('@getUsers')` y verificar que su aplicaci贸n maneje la respuesta simulada correctamente.
Trabajar con almacenamiento local y cookies
Cypress proporciona comandos para interactuar con el almacenamiento local y las cookies. Puede usar estos comandos para establecer, obtener y borrar el almacenamiento local y las cookies en sus pruebas.
Para establecer un elemento de almacenamiento local, puede utilizar el comando `cy.window()` para acceder al objeto window y luego usar el m茅todo `localStorage.setItem()`. Por ejemplo:
cy.window().then((win) => {
win.localStorage.setItem('myKey', 'myValue')
})
Para obtener un elemento de almacenamiento local, puede utilizar el comando `cy.window()` y luego usar el m茅todo `localStorage.getItem()`. Por ejemplo:
cy.window().then((win) => {
const value = win.localStorage.getItem('myKey')
expect(value).to.equal('myValue')
})
Para establecer una cookie, puede utilizar el comando `cy.setCookie()`. Por ejemplo:
cy.setCookie('myCookie', 'myCookieValue')
Para obtener una cookie, puede utilizar el comando `cy.getCookie()`. Por ejemplo:
cy.getCookie('myCookie').should('have.property', 'value', 'myCookieValue')
Manejo de cargas de archivos
Cypress proporciona un plugin llamado `cypress-file-upload` que simplifica las cargas de archivos en sus pruebas. Para instalar el plugin, ejecute el siguiente comando:
npm install -D cypress-file-upload
A continuaci贸n, agregue la siguiente l铆nea a su archivo `cypress/support/commands.js`:
import 'cypress-file-upload';
A continuaci贸n, puede utilizar el comando `cy.uploadFile()` para cargar un archivo. Por ejemplo:
cy.get('input[type="file"]').attachFile('example.txt')
Trabajar con IFrames
Probar IFrames puede ser complicado, pero Cypress proporciona una forma de interactuar con ellos. Puede usar el comando `cy.frameLoaded()` para esperar a que se cargue un IFrame, y luego usar el comando `cy.iframe()` para obtener el objeto document del IFrame.
cy.frameLoaded('#myIframe')
cy.iframe('#myIframe').find('button').click()
Cypress e Integraci贸n Continua/Implementaci贸n Continua (CI/CD)
Integrar Cypress en su canalizaci贸n de CI/CD es esencial para garantizar la calidad de su aplicaci贸n. Puede ejecutar pruebas de Cypress en modo sin interfaz en su entorno de CI/CD. Aqu铆 le mostramos c贸mo:
- Instalar Cypress: Aseg煤rese de que Cypress est茅 instalado como una dependencia en su proyecto.
- Configurar CI/CD: Configure su canalizaci贸n de CI/CD para ejecutar pruebas de Cypress despu茅s de cada compilaci贸n.
- Ejecutar Cypress sin interfaz: Use el comando `cypress run` para ejecutar pruebas de Cypress en modo sin interfaz.
Ejemplo de configuraci贸n de CI/CD (usando GitHub Actions):
name: Cypress Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
cypress-run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
- name: Install dependencies
run: npm install
- name: Cypress run
uses: cypress-io/github-action@v5
with:
start: npm start
wait-on: 'http://localhost:3000'
Esta configuraci贸n ejecutar谩 las pruebas de Cypress cada vez que se env铆e c贸digo a la rama `main` o se cree una solicitud de extracci贸n contra la rama `main`. La acci贸n `cypress-io/github-action` simplifica el proceso de ejecuci贸n de pruebas de Cypress en GitHub Actions.
Depuraci贸n de pruebas Cypress
Cypress proporciona excelentes herramientas de depuraci贸n para ayudarle a identificar y solucionar problemas en sus pruebas. Aqu铆 hay algunos consejos para depurar pruebas Cypress:
- Use el Ejecutor de pruebas de Cypress: El Ejecutor de pruebas de Cypress proporciona una interfaz visual para ejecutar y depurar sus pruebas. Puede recorrer sus pruebas un comando a la vez, inspeccionar el estado de la aplicaci贸n y ver mensajes de error detallados.
- Use el comando `cy.pause()`: El comando `cy.pause()` pausa la ejecuci贸n de su prueba y le permite inspeccionar el estado de la aplicaci贸n en las herramientas de desarrollo del navegador.
- Use el comando `cy.debug()`: El comando `cy.debug()` imprime el elemento seleccionado en la consola, lo que le permite inspeccionar sus propiedades y atributos.
- Utilice las herramientas de desarrollo del navegador: Las herramientas de desarrollo del navegador proporcionan una gran cantidad de informaci贸n sobre su aplicaci贸n, incluyendo el DOM, las peticiones de red y los registros de la consola.
- Lea los mensajes de error cuidadosamente: Cypress proporciona mensajes de error detallados que pueden ayudarle a identificar la causa del error. Preste atenci贸n al mensaje de error y al rastreo de la pila.
Cypress vs. Otros frameworks de pruebas
Si bien Cypress es un potente framework de pruebas de extremo a extremo, es esencial comprender c贸mo se compara con otras opciones populares. Aqu铆 hay una breve descripci贸n general:
- Selenium: Selenium es un framework de pruebas de automatizaci贸n ampliamente utilizado. Aunque es flexible y compatible con varios lenguajes, puede ser complejo de configurar y mantener. Cypress ofrece una experiencia m谩s sencilla y amigable para el desarrollador, particularmente para aplicaciones basadas en JavaScript.
- Puppeteer: Puppeteer es una biblioteca de nodos que proporciona una API de alto nivel para controlar Chrome o Chromium sin interfaz. Es excelente para el raspado y la automatizaci贸n de tareas del navegador, pero puede requerir una configuraci贸n m谩s manual en comparaci贸n con Cypress para las pruebas de extremo a extremo.
- Playwright: Playwright es otro framework de automatizaci贸n entre navegadores desarrollado por Microsoft. Comparte similitudes con Puppeteer, pero ofrece una compatibilidad con navegadores m谩s amplia. Cypress tiene un depurador de viaje en el tiempo 煤nico y una experiencia de prueba m谩s integrada.
La elecci贸n del framework depende de las necesidades y requisitos espec铆ficos de su proyecto. Cypress es una excelente opci贸n para las aplicaciones web modernas que requieren pruebas de extremo a extremo r谩pidas, fiables y amigables para los desarrolladores.
Ejemplos del mundo real de Cypress en acci贸n
Exploremos algunos ejemplos del mundo real de c贸mo se puede usar Cypress para probar diferentes tipos de aplicaciones web:
Prueba de una aplicaci贸n de comercio electr贸nico
Puede usar Cypress para probar varios flujos de usuarios en una aplicaci贸n de comercio electr贸nico, como:
- B煤squeda de productos
- A帽adir productos al carrito
- Pagar y realizar un pedido
- Gestionar la configuraci贸n de la cuenta
Aqu铆 hay un ejemplo de una prueba Cypress que verifica que un usuario puede agregar un producto a su carrito con 茅xito:
it('A帽ade un producto al carrito', () => {
cy.visit('/products')
cy.get('.product-card').first().find('button').click()
cy.get('.cart-count').should('have.text', '1')
})
Prueba de una aplicaci贸n de redes sociales
Puede usar Cypress para probar las interacciones del usuario en una aplicaci贸n de redes sociales, como:
- Crear una nueva publicaci贸n
- Dar a me gusta a una publicaci贸n
- Comentar una publicaci贸n
- Seguir a otros usuarios
Aqu铆 hay un ejemplo de una prueba Cypress que verifica que un usuario puede crear una nueva publicaci贸n con 茅xito:
it('Crea una nueva publicaci贸n', () => {
cy.visit('/profile')
cy.get('#new-post-textarea').type('隆Hola, mundo!')
cy.get('#submit-post-button').click()
cy.get('.post').first().should('contain', '隆Hola, mundo!')
})
Prueba de una aplicaci贸n bancaria
Para las aplicaciones bancarias, Cypress se puede usar para probar funcionalidades cr铆ticas como:
- Iniciar sesi贸n de forma segura
- Comprobar los saldos de las cuentas
- Transferir fondos
- Gestionar beneficiarios
Una prueba para verificar una transferencia de fondos podr铆a verse as铆 (con la simulaci贸n apropiada para la seguridad):
it('Transfiere fondos con 茅xito', () => {
cy.visit('/transfer')
cy.get('#recipient-account').type('1234567890')
cy.get('#amount').type('100')
cy.intercept('POST', '/api/transfer', { statusCode: 200, body: { success: true } }).as('transfer')
cy.get('#transfer-button').click()
cy.wait('@transfer')
cy.get('.success-message').should('be.visible')
})
Conclusi贸n
Cypress es un potente y vers谩til framework de pruebas de extremo a extremo que puede ayudarle a garantizar la calidad y fiabilidad de sus aplicaciones web. Su API amigable para el desarrollador, sus potentes funciones y su excelente rendimiento lo convierten en una opci贸n popular entre los desarrolladores e ingenieros de control de calidad de todo el mundo. Al seguir las mejores pr谩cticas descritas en esta gu铆a, puede escribir pruebas Cypress eficaces que le ayudar谩n a detectar errores al principio del proceso de desarrollo y a ofrecer software de alta calidad a sus usuarios.
A medida que las aplicaciones web contin煤an evolucionando, la importancia de las pruebas de extremo a extremo solo aumentar谩. Adoptar Cypress e integrarlo en su flujo de trabajo de desarrollo le permitir谩 crear experiencias web m谩s s贸lidas, fiables y f谩ciles de usar.